//echo '{"name": "Alice", "content": "111"}'$ | nc 192.168.126.1 8888
//echo '{"name": "Alice", "content": "111"}'$'{"name": "Alice' | nc 192.168.126.1 8888

package main

import (
    "bufio"
    "encoding/json"
    "fmt"
    "net"
    "os"
    "time"
)

// 确保和服务端定义的Message结构体一致
type Message struct {
    Name    string `json:"name"`
    Content string `json:"content"`
}

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:8888")
    if err!= nil {
        fmt.Println("连接服务端出错:", err)
        os.Exit(1)
    }
    defer conn.Close()

    writer := bufio.NewWriter(conn)

    // 模拟粘包：连续快速发送两条消息，让其可能粘在一起
    msg1 := Message{
       Name:    "Alice",
       Content: "AliceAliceAliceAliceAliceAlice",
    }
    jsonBytes1, err := json.Marshal(msg1)
    if err!= nil {
       fmt.Println("JSON编码第一条消息出错:", err)
       os.Exit(1)
    }
    msgData1 := string(jsonBytes1) + "$"
    msg2 := Message{
       Name:    "Bob",
       Content: "BobBobBobBobBobBob",
    }
    jsonBytes2, err := json.Marshal(msg2)
    if err!= nil {
       fmt.Println("JSON编码第二条消息出错:", err)
       os.Exit(1)
    }
    msgData2 := string(jsonBytes2) + "$"
    // 快速连续写入，增加粘包几率
    _, err = writer.WriteString(msgData1)
    if err!= nil {
       fmt.Println("发送第一条消息出错:", err)
       os.Exit(1)
    }
    _, err = writer.WriteString(msgData2)
    if err!= nil {
       fmt.Println("发送第二条消息出错:", err)
       os.Exit(1)
    }
    writer.Flush()

    // 暂停一下，让服务端处理刚才的粘包情况
    time.Sleep(2 * time.Second)

    // 模拟半包：将一条消息分两次发送
    msg3 := Message{
       Name:    "Charlie",
       Content: "ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssEnd",
    }
    jsonBytes3, err := json.Marshal(msg3)
    if err!= nil {
       fmt.Println("JSON编码第三条消息出错:", err)
       os.Exit(1)
    }
    msgData3 := string(jsonBytes3) + "$"
    half1 := msgData3[:len(msgData3)/2]
    half2 := msgData3[len(msgData3)/2:]
    // 先发送一半消息
    _, err = writer.WriteString(half1)
    if err!= nil {
       fmt.Println("发送第三条消息前半部分出错:", err)
       os.Exit(1)
    }
    writer.Flush()
    // 稍作停顿，模拟网络延迟导致半包
    time.Sleep(1 * time.Second)
    // 再发送另一半消息
    _, err = writer.WriteString(half2)
    if err!= nil {
       fmt.Println("发送第三条消息后半部分出错:", err)
       os.Exit(1)
    }
    writer.Flush()
}